import { Injectable, NestMiddleware } from '@nestjs/common';
import { Request, Response, NextFunction } from 'express';
import { PrismaService } from '@/common/prisma/prisma.service';

// declare global {
//   namespace Express {
//     interface Request {
//       user?: any;
//     }
//   }
// }

@Injectable()
export class AuthMiddleware implements NestMiddleware {
  constructor(private prisma: PrismaService) {}

  async use(req: Request, res: Response, next: NextFunction) {
    try {
      // 从请求头中获取token
      const token = req.headers.authorization?.split(' ')[1];

      // 如果没有token，则认为用户未登录
      if (!token) {
        req.user = null;
        return next();
      }
      // 这里应该有token验证逻辑，例如JWT验证
      // 假设token中包含用户ID，这里简化处理，直接从token中提取用户ID
      // 实际应用中，您应该使用JWT或其他方式正确验证token
      const userId = this.extractUserIdFromToken(token);

      if (userId) {
        // 使用Prisma查询用户信息
        const user = await this.prisma.user.findUnique({
          where: { id: userId },
        });

        if (user) {
          // 将用户信息附加到请求对象上
          req.user = user;
        }
      }

      next();
    } catch (error) {
      console.error('认证中间件错误:', error);
      req.user = null;
      next();
    }
  }

  private extractUserIdFromToken(token: string): number | null {
    try {
      // 这里应该是您的token解析逻辑
      // 示例：假设token是一个简单的数字字符串
      return parseInt(token, 10);

      // 如果您使用JWT，可能的实现如下：
      // const decoded = jwt.verify(token, 'your_secret_key');
      // return decoded.userId;
    } catch (error: any) {
      console.log(error);
      return null;
    }
  }
}
